# 1.自定义存储系统必须是以下子类from django.core.files.storage import Storage

from django.core.files.storage import Storage
from django.conf import settings
# from fdfs_client.client import Fdfs_client
from fdfs_client.client import Fdfs_client
from django.utils.deconstruct import deconstructible


@deconstructible
class MyStorage(Storage):

    # 2.Django必须能够在没有任何参数的情况下实例化您的存储系统
    # 这意味着任何设置都应该来自django.conf.settings

    # def __init__(self, option=None):
    #     if not option:
    #         option = settings.CUSTOM_STORAGE_OPTIONS

    def __init__(self,path=None,ip=None):
        if not path:
            path = settings.FDFS_CLIENT_CONF
            self.path = path

        if not ip:
            ip = settings.FDFS_URL
            self.ip = ip



    # 3.您的存储类必须实现_open()和)_save()方法以及
    # 适用于您的存储类的任何其他方法
    def _open(self,name,mode="rb"):
        """此方法不用实现"""
        pass

    # save保存
    # 实现保存方法,将图片通过Fdfs保存 Storage中
    def _save(self,name,content,max_length=None):

        # 1.创建client

        # client = Fdfs_client("utils/fastdfs/client.conf")
        # client = Fdfs_client(settings.FDFS_CLIENT_CONF)
        client = Fdfs_client(self.path)

        # 2.获取图片

        # save 参数中:
        # name:表示图片的名字 不是路径
        # content:内容 二进制内容
        data = content.read()

        # 3.上传
        # buffer 上传二进制图片
        result =client.upload_by_buffer(data)


        # 4.判断上穿得状态,并获取file_id
        if result.get('Status') == 'Upload successed.':
            file_id = result.get("Remote file_id")
        else:
            raise Exception('上传失败')

        # 5.需要把file_id返回就可以

        return  file_id


        # 还有两个方法
        # 是否存在exists
        # 不会出现图片覆盖的情况,直接返回False

    def exists(self, name):
        return False


    def url(self, name):
        # name 默认就是我们在save中返回的file_id
        # return settings.FDFS_URL+name
        return self.ip + name


